# -*- mode: python ; coding: utf-8 -*-
# app.spec - PyInstaller配置文件，用于定义如何将Python应用打包为可执行文件

# 定义加密方式，None表示不加密
block_cipher = None

# Analysis对象定义了应用程序的构建过程，包括入口脚本、依赖关系等
a = Analysis(
    ['app.py'],                # 主脚本，程序的入口点
    pathex=[],                 # 额外的导入路径，为空表示使用默认Python路径
    binaries=[],               # 额外的二进制文件(dll, so等)，为空表示自动检测
    datas=[
        ('assets', 'assets'),  # 资源文件会被复制到_internal/assets目录
        ('config', 'config'),  # 配置文件会被复制到_internal/config目录
    ],
    hiddenimports=[            # 指定隐式导入的模块，PyInstaller可能无法自动检测这些依赖
        'PySide6.QtCore',      # Qt核心功能
        'PySide6.QtGui',       # Qt GUI相关功能
        'PySide6.QtWidgets',   # Qt控件库
        'PySide6.QtSvg',       # SVG图像支持
        'PySide6.QtNetwork',   # 网络功能支持
        'numpy',               # 数值计算库
        'cv2',                 # OpenCV图像处理库
        'qasync',              # Qt和asyncio的集成
        'asyncio',             # 异步IO支持
        'PIL',                 # Python图像处理库
        'pyautogui',           # 自动化GUI操作
        'tempfile',            # 临时文件操作
    ],
    hookspath=[],              # 自定义钩子路径，为空表示使用PyInstaller默认钩子
    hooksconfig={},            # 钩子配置，默认为空
    runtime_hooks=[],          # 运行时钩子，为空表示不使用额外运行时钩子
    excludes=[],               # 要排除的模块，为空表示不排除任何模块
    win_no_prefer_redirects=False,  # Windows特定选项，是否禁用DLL重定向
    win_private_assemblies=False,   # Windows特定选项，是否使用私有程序集
    cipher=block_cipher,       # 使用上面定义的加密方式
    noarchive=False,           # 是否不创建zip归档，False表示创建归档
)

# PYZ对象定义了如何创建Python模块的压缩归档
pyz = PYZ(
    a.pure,                    # 使用Analysis对象中的纯Python模块
    cipher=block_cipher        # 使用上面定义的加密方式
)

# EXE对象定义了如何创建最终的可执行文件
exe = EXE(
    pyz,                       # 使用上面创建的PYZ对象
    a.scripts,                 # 使用Analysis对象中的脚本
    [],                        # 额外的脚本，为空表示不添加
    exclude_binaries=True,     # 是否排除二进制文件，True表示二进制文件将在COLLECT中处理
    name='app',                # 生成的可执行文件名称
    debug=False,               # 是否生成调试版本，False表示生成发布版本
    bootloader_ignore_signals=False,  # bootloader是否忽略信号
    strip=False,               # 是否剥离可执行文件中的符号，False表示不剥离
    upx=True,                  # 是否使用UPX压缩可执行文件，True表示使用
    console=True,              # 是否显示控制台窗口，True表示显示
    disable_windowed_traceback=False,  # 是否禁用窗口化回溯，False表示不禁用
    argv_emulation=False,      # macOS特定选项，是否模拟命令行参数
    target_arch=None,          # 目标架构，None表示使用当前系统架构
    codesign_identity=None,    # 代码签名身份，None表示不签名
    entitlements_file=None,    # macOS特定选项，权利文件路径
)

# COLLECT对象定义了如何创建最终的分发目录
coll = COLLECT(
    exe,                       # 使用上面创建的EXE对象
    a.binaries,                # 使用Analysis对象中的二进制文件
    a.zipfiles,                # 使用Analysis对象中的zip文件
    a.datas,                   # 使用Analysis对象中的数据文件
    strip=False,               # 是否剥离二进制文件中的符号，False表示不剥离
    upx=True,                  # 是否使用UPX压缩二进制文件，True表示使用
    upx_exclude=[],            # 不使用UPX压缩的文件列表，为空表示不排除任何文件
    name='app',                # 分发目录的名称
)
